home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Missionary
/
Missionary, The - Issue 1 (1991-11)(ABOTS PD)(PD).adf
/
Technical
/
Intro.ASM
< prev
next >
Wrap
Assembly Source File
|
1991-11-07
|
14KB
|
663 lines
OPT C- ;Turn off case sensitivity
Section MISSION,CODE_C ;Make amiga_dos load the whole prg to chipram
*******************************************************************
Cmove MACRO
dc.w \2,\1
ENDM
Cwait MACRO
dc.w \2<<8!\1!1,$fffe
ENDM
Blitwait MACRO
bw_\@ btst #14,dmaconr(a5)
bne.s bw_\@
ENDM
CatchVB MACRO
vb1_\@:
btst #0,vposr+1(a5)
beq.s vb1_\@
vb2_\@:
btst #0,vposr+1(a5)
bne.s vb2_\@
ENDM
*******************************************************************
start:
move.l #$dff000,a5 ;address of custom regs.
catchvb
blitwait
jsr takesys ;kill the operating system
move.w #$8240,dmacon(a5)
move.l #0,0 ;for people with an A590
*******************************************************************
makescreens:
move.l #piccy+(0*planesize),d0 ;address of picture
move.w d0,plane1l ;store in copper list
swap d0
move.w d0,plane1h
move.l #piccy+(1*planesize),d0 ;second plane
move.w d0,plane2l
swap d0
move.w d0,plane2h
move.l #piccy+(2*planesize),d0 ;third plane
move.w d0,plane3l
swap d0
move.w d0,plane3h
move.l #piccy+(3*planesize),d0 ;fourth plane
move.w d0,plane4l
swap d0
move.w d0,plane4h
*******************************************************************
set_dma:
catchvb
blitwait
move.w #$02e0,dmacon(a5)
move.w #$87e0,dmacon(a5) ;turn on blitter-nasty,
;master DMA, bitplane DMA,
;copper, blitter + sprite DMA
*******************************************************************
title:
catchvb ;wait for vertical blank
blitwait ;wait for blitter to be free
move.w #$01a0,dmacon(a5)
move.l #main_copper,cop1lc(a5) ;point copper list to our
move.w #$ff,copjmp1(a5) ;custom copper list
move.w #$81a0,dmacon(a5)
move.w #$4010,intena(a5) ;disable ints.
move.l #main_int,$6c ;point to add. of our routine
move #$c010,intena(a5) ;re-enable interrupts
move.w #2,curspeed
move.w #2,palspeed
move.w #18,d7
fade_cols:
move.w #2,int_occur
cols_wait:
cmpi.w #0,int_occur ;wait until two frames have gone
bne cols_wait
lea colours,a0 ;set up fade routine
lea ac_pal,a1 ;by pointing to our palette
lea normal_colours,a2
lea palette,a3
move.w #15,d6
set_palette:
move.w (a0),(a1)+ ;copy present colours to fade
move.w (a2)+,(a3)+ ;routine
add.w #4,a0
dbra d6,set_palette
move.w #15,d0
bsr palchange ;call fade routine
lea ac_pal,a0
lea colours,a1
move.w #15,d6
copy_colours:
move.w (a0)+,(a1) ;now copy colours back to
add.w #4,a1 ;our copperlist
dbra d6,copy_colours
dbra d7,fade_cols
*******************************************************************
main:
btst #7,ciaapra ;is the joystick fire pressed?
beq fade_off ;yes, so exit
btst #10,$dff016 ;what about the right mouse?
beq fade_off ;if that is pressed, exit
btst #6,ciaapra ;what about left mouse then?
bne main ;nope, fingers are free!
fade_off:
move.w #2,curspeed ;set up fade routine again
move.w #2,palspeed
move.w #15,d7
fade_cols2:
move.w #2,int_occur
cols_wait2:
cmpi.w #0,int_occur
bne cols_wait2
lea colours,a0
lea ac_pal,a1
lea black_colours,a2
lea palette,a3
move.w #15,d6
set_palette2:
move.w (a0),(a1)+ ;copy present colours
move.w (a2)+,(a3)+
add.w #4,a0
dbra d6,set_palette2
move.w #15,d0
bsr palchange ;call fade off routine
lea ac_pal,a0
lea colours,a1
move.w #15,d6
copy_colours2:
move.w (a0)+,(a1) ;copy colours into clist
add.w #4,a1
dbra d6,copy_colours2
dbra d7,fade_cols2
*******************************************************************
zzap:
catchvb
blitwait
jsr freesys ;re-enable the op. system
ende:
clr.l d0 ;and return to DOS!
rts
*******************************************************************
* This routine uses two tables -
* "Palette" -- Holds the user's palette to change TO
* "Ac_Pal" -- The actual palette at the moment. (Internal)
* The user can change the speed by writing a WORD value to
* PalSpeed. The value designates 50ths of a second between each change.
Palchange:
movem.l d0-d7/a0-a6,-(SP) ; Preserve registers
move.w #0,done_pal
sub.w #1,CurSpeed
beq PalOK
bra Pal006
PalOK:
move.w #1,done_pal
move.w PalSpeed,CurSpeed
lea Palette(pc),a0 ; User's Palette
lea Ac_Pal(pc),a1 ; Actual (current) palette
Pal001:
* D1 holds red pigment, d2 holds green, d3 holds blue
move.w (a0)+,d1 ; Load user's color
move.w d1,d2
move.w d1,d3
and.w #$f00,d1
and.w #$0f0,d2
and.w #$00f,d3
* Now for the Actual Palette.
move.w (a1),d4 ; Don't incr., we re-write d4 later
move.w d4,d5
move.w d4,d6
and.w #$f00,d4
and.w #$0f0,d5
and.w #$00f,d6
* OK let's convert that color!
cmp.w d1,d4
blt.s .Rless ; if D4 is less than D1
bgt.s .Rmore
bra.s .Rfin
.Rless:
add.w #$100,d4
bra.s .Rfin
.Rmore:
sub.w #$100,d4
.Rfin:
cmp.w d2,d5
blt.s .Gless ; if D5 is less than D2
bgt.s .Gmore
bra.s .Gfin
.Gless:
add.w #$010,d5
bra.s .Gfin
.Gmore:
sub.w #$010,d5
.Gfin:
cmp.w d3,d6
blt.s .Bless ; if D6 is less than D3
bgt.s .Bmore
bra.s .Bfin
.Bless:
add.w #$001,d6
bra.s .Bfin
.Bmore:
sub.w #$001,d6
.Bfin:
* Now to convert Actual Palette base colors back again,
or.w d5,d4
or.w d6,d4 ; D4 holds new color
move.w d4,(a1)+
dbf d0,Pal001
* Note, ChangePal.ASM Doesn't do anything with Ac_Pal, It's
* up to you to do what you want to do with it to allow
*greater flexibility.
Pal006:
movem.l (SP)+,d0-d7/a0-a6 ; restore registers
RTS
Palette ds.w 32
Ac_Pal ds.w 32
PalSpeed: dc.w 2 ; Default speed : every OTHER frame
CurSpeed: dc.w 2 ; (This to be the best speed)
done_pal: dc.w 0
*******************************************************************
main_int:
movem.l d0-d7/a0-a6,-(sp)
lea $dff000,a5
and #$10,intreqr(a5) ;is this a copper int.?
beq main_out ;no, so exit
move.w #$10,intreq(a5) ;clear interrupt flag
cmpi.w #0,int_occur
beq main_out
sub.w #1,int_occur
main_out:
movem.l (sp)+,d0-d7/a0-a6
rte
int_occur: dc.w 0
*******************************************************************
* The next bit is our custom COPPERLIST *
*******************************************************************
main_copper:
dc.w bplcon1,0 ;standard screen
dc.w bpl1mod,0,bpl2mod,0 ;no modulos
dc.w bplcon0,$4200 ;4 bitplanes
dc.w bplcon2,$0 ;normal priority
dc.w diwstrt,$2c81
dc.w diwstop,$2cc1
dc.w ddfstrt,$0038
dc.w ddfstop,$00d0
dc.w spr0pth ;these are the sprite
sp0h dc.w 0 ;pointers. We have set
dc.w spr0ptl ;them to point to 0
sp0l: dc.w 0 ;as we are not using them
dc.w spr1pth
sp1h: dc.w 0
dc.w spr1ptl
sp1l: dc.w 0
dc.w spr2pth
sp2h: dc.w 0
dc.w spr2ptl
sp2l: dc.w 0
dc.w spr3pth
sp3h: dc.w 0
dc.w spr3ptl
sp3l: dc.w 0
dc.w spr4pth
sp4h: dc.w 0
dc.w spr4ptl
sp4l: dc.w 0
dc.w spr5pth
sp5h: dc.w 0
dc.w spr5ptl
sp5l: dc.w 0
dc.w spr6pth
sp6h: dc.w 0
dc.w spr6ptl
sp6l: dc.w 0
dc.w spr7pth
sp7h: dc.w 0
dc.w spr7ptl
sp7l: dc.w 0
dc.w bpl1pth ;these are the bitplane
plane1h dc.w 0 ;pointers
dc.w bpl1ptl
plane1l dc.w 0
dc.w bpl2pth
plane2h dc.w 0
dc.w bpl2ptl
plane2l dc.w 0
dc.w bpl3pth
plane3h dc.w 0
dc.w bpl3ptl
plane3l dc.w 0
dc.w bpl4pth
plane4h dc.w 0
dc.w bpl4ptl
plane4l dc.w 0
;there now follows the screen colours, in the following order:-
;1 WORD colour offset, then 1 WORD containing the colour data
dc.w col0
colours:
dc.w $0000,col1,$0000,col2,$0000,col3,$0000
dc.w col4,$0000,col5,$0000,col6,$0000,col7,$0000
dc.w col8,$0000,col9,$0000,col10,$0000,col11,$0000
dc.w col12,$0000,col13,$0000,col14,$0000,col15,$0000
dc.w $ff0f,$fffe,$ffdd,$fffe ;use copper in PAL area
cwait 0,51
dc.w intreq,$8010
cwait 255,254
*******************************************************************
normal_colours:
dc.w $0000,$0c73,$0976,$0a87,$0654,$0330,$0430,$0430
dc.w $0530,$0740,$0840,$0950,$0a51,$0a62,$0643,$0444
black_colours:
dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
*****************************************************************************
* TAKESYS and FREESYS were written by P.R.BRAIN (GARION) to safely
* take down and restore the operating system. Thanks to Paul for
* allowing us to use them.
*****************************************************************************
* TAKESYS will disable the OS interrupts and replace with custom drivers
* Also saves out the DMA control status...
* Returns with all Dma and all interrupts OFF
*****************************************************************************
Newvects dc.l lev1,lev2,lev3,lev4,lev5,lev6,lev7
Oldvects ds.l 7
OldTAh dc.b 0
OldTAl dc.b 0
Oldcra dc.b 0
even
Oldintreq dc.w 0
Oldintena dc.w 0
Olddmacon dc.w 0
gfxname dc.b "graphics.library",0
syscop1 dc.l 0
syscop2 dc.l 0
takesys:
move.l 4.w,a6
jsr forbid(a6)
lea custom,a5
blitwait
lea gfxname,a1
moveq #0,d0
jsr openlib(a6)
move.l d0,a1
move.l oslist(a1),syscop1 ;store OS copper addrs
move.l oslist2(a1),syscop2
jsr closelib(a6)
lea $64.w,a0
lea Oldvects,a1
moveq #7-1,d0
vsavelp move.l (a0)+,(a1)+
dbf d0,vsavelp ;Store OS vectors.
move dmaconr(a5),Olddmacon ;store DMA
move.w intreqr(a5),oldintreq
move.w intenar(a5),oldintena ;store ints
move.w #$7fff,intena(a5)
move.w #$7fff,intreq(a5) ;disable all ints
catchVB
move.w #$7fff,dmacon(a5) ;&dma
lea newvects,a0
lea $64.w,a1
moveq #7-1,d0
vloadlp move.l (a0)+,(a1)+
dbf d0,vloadlp ;load new handler vectors
;Now setup the ciaa for keyboard...
move.b ciaa+cra,Oldcra
move.b #%00010000,ciaa+cra ;SP input, STOP & Forceload timerA
move.b ciaa+Talo,oldtal
move.b ciaa+Tahi,oldtah
;Configure CIA-A for kboard...
move.b #0,ciaa+cra ;SP input...
move.b #%01111111,ciaa+icr ;clear all cia ints
move.b #%10001000,ciaa+icr ;SP int on
move.b ciaa+icr,d0 ;clear IRs
move.w #$c008,intena(a5)
rts
*****************************************************************************
* FREESYS will put the OS back together again... (Better had!)
*****************************************************************************
freesys:
lea custom,a5
move #$7fff,intena(a5)
move #$7fff,intreq(a5) ;disable all ints
move #$7fff,dmacon(a5) ;& Dma
move.b #0,ciaa+cra ;reset ciaa...
move.b #%01111111,ciaa+icr
move.b #%10011011,ciaa+icr
move.b oldtal,ciaa+talo
move.b oldtah,ciaa+tahi
move.b oldcra,ciaa+cra
lea oldvects,a0
lea $64.w,a1
moveq #7-1,d0
vloslp move.l (a0)+,(a1)+
dbf d0,vloslp ;reset OS vectors
catchvb
move.l syscop1,cop1lc(a5)
move.l syscop2,cop2lc(a5)
move #0,copjmp1(a5)
move #0,copjmp2(a5) ;reset the copper
move oldintena,d0
or #$c000,d0
move d0,intena(a5) ;restore OS ints
move oldintreq,d0
or #$8000,d0
move d0,intreq(a5)
catchVB
move olddmacon,d0
or #$8200,d0
move d0,dmacon(a5) ;restore OS Dma
move.l 4.w,a6
jsr permit(a6)
rts
*****************************************************************************
* Unused Interrupt Drivers
*****************************************************************************
LEV1:
LEV2:
LEV3:
LEV4:
LEV5:
LEV6:
LEV7:
rte
*******************************************************************
;Offsets for OS routines....
Openlib equ -30-522
Closelib equ -414 ;...Equates for OS calls...
Forbid equ -30-102
Permit equ -30-108
ciaapra = $bfe001
OsList EQU 38
OsList2 EQU 50
*******************************************************************
;Equates for hardware registers
custom EQU $dff000
dmaconr EQU $002
vposr EQU $004
vhposr EQU $006
intenar EQU $01C
intreqr EQU $01E
vposw EQU $02A
vhposw EQU $02C
cop1lc EQU $080
cop2lc EQU $084
copjmp1 EQU $088
copjmp2 EQU $08A
diwstrt EQU $08E
diwstop EQU $090
ddfstrt EQU $092
ddfstop EQU $094
dmacon EQU $096
intena EQU $09A
intreq EQU $09C
aud0vol EQU $0A8
aud1vol EQU $0B8
aud2vol EQU $0C8
aud3vol EQU $0D8
bpl1pth EQU $0E0
bpl1ptl EQU $0E2
bpl2pth EQU $0E4
bpl2ptl EQU $0E6
bpl3pth EQU $0E8
bpl3ptl EQU $0EA
bpl4pth EQU $0EC
bpl4ptl EQU $0EE
bpl5pth EQU $0F0
bpl5ptl EQU $0F2
bpl6pth EQU $0F4
bpl6ptl EQU $0F6
bplcon0 EQU $100
bplcon1 EQU $102
bplcon2 EQU $104
bpl1mod EQU $108
bpl2mod EQU $10A
spr0pth EQU $120
spr0ptl EQU $122
spr1pth EQU $124
spr1ptl EQU $126
spr2pth EQU $128
spr2ptl EQU $12A
spr3pth EQU $12C
spr3ptl EQU $12E
spr4pth EQU $130
spr4ptl EQU $132
spr5pth EQU $134
spr5ptl EQU $136
spr6pth EQU $138
spr6ptl EQU $13A
spr7pth EQU $13C
spr7ptl EQU $13E
col0 EQU $180
col1 EQU $182
col2 EQU $184
col3 EQU $186
col4 EQU $188
col5 equ $18a
col6 equ $18c
col7 equ $18e
col8 EQU $190
col9 equ $192
col10 equ $194
col11 equ $196
col12 equ $198
col13 equ $19a
col14 equ $19c
col15 equ $19e
col16 equ $1A0
col17 equ $1a2
col18 equ $1a4
col19 equ $1a6
col20 equ $1a8
col21 equ $1aa
col22 equ $1ac
col23 equ $1ae
col24 equ $1b0
col25 equ $1b2
col26 equ $1b4
col27 equ $1b6
col28 equ $1b8
col29 equ $1ba
col30 equ $1bc
col31 equ $1be
ciaa equ $bfe001
ciab equ $bfd000
pra EQU $0000
prb EQU $0100
ddra EQU $0200
ddrb EQU $0300
talo EQU $0400
tahi EQU $0500
tblo EQU $0600
tbhi EQU $0700
todlow EQU $0800
todmid EQU $0900
todhi EQU $0A00
sp EQU $0C00
icr EQU $0D00
cra EQU $0E00
crb EQU $0F00
*******************************************************************
planesize equ 40*256
timer: dc.l 0
*******************************************************************
piccy:
;incbin "dh0:mm/piccy"
;to include a picture here, just replace the
;above INCBIN with one of your own, specifying the
;correct pathname for the picture. The picture
;must be in RAW format, not IFF.
*******************************************************************
end